/* malihu custom scrollbar plugin - http://manos.malihu.gr */
(function ($) {
    $.fn.mCustomScrollbar = function (scrollType,animSpeed,easeType,bottomSpace,draggerDimType,mouseWheelSupport,scrollBtnsSupport,scrollBtnsSpeed){
        var id = $(this).attr("id");
        var $customScrollBox=$("#"+id+" .customScrollBox");
        var $customScrollBox_container=$("#"+id+" .customScrollBox .container_scroll");
        var $customScrollBox_content=$("#"+id+" .customScrollBox .content");
        var $dragger_container=$("#"+id+" .dragger_container");
        var $dragger=$("#"+id+" .dragger");
        
        var $scrollUpBtn=$("#"+id+" .scrollUpBtn");
        var $scrollDownBtn=$("#"+id+" .scrollDownBtn");
        var $customScrollBox_horWrapper=$("#"+id+" .customScrollBox .horWrapper");
	
        //get & store minimum dragger height & width (defined in css)
        if(!$customScrollBox.data("minDraggerHeight")){
           
            $customScrollBox.data("minDraggerHeight",$dragger.height());
        }
        if(!$customScrollBox.data("minDraggerWidth")){
            $customScrollBox.data("minDraggerWidth",$dragger.width());
        }
	
        //get & store original content height & width
        if(!$customScrollBox.data("contentHeight")){
            $customScrollBox.data("contentHeight",$customScrollBox_container.height());
        }
        if(!$customScrollBox.data("contentWidth")){
            $customScrollBox.data("contentWidth",$customScrollBox_container.width());
        }
	
        CustomScroller();
	
        function CustomScroller(reloadType){
            //horizontal scrolling ------------------------------
            if(scrollType=="horizontal"){
                var visibleWidth=$customScrollBox.width();
                //set content width automatically
                $customScrollBox_horWrapper.css("width",999999); //set a rediculously high width value ;)
                $customScrollBox.data("totalContent",$customScrollBox_container.width()); //get inline div width
                $customScrollBox_horWrapper.css("width",$customScrollBox.data("totalContent")); //set back the proper content width value
			
                if($customScrollBox_container.width()>visibleWidth){ //enable scrollbar if content is long
                    $dragger.css("display","block");
                    if(reloadType!="resize" && $customScrollBox_container.width()!=$customScrollBox.data("contentWidth")){
                        $dragger.css("left",0);
                        $customScrollBox_container.css("left",0);
                        $customScrollBox.data("contentWidth",$customScrollBox_container.width());
                    }
                    $dragger_container.css("display","block");
                    $scrollDownBtn.css("display","inline-block");
                    $scrollUpBtn.css("display","inline-block");
                    var totalContent=$customScrollBox_content.width();
                    var minDraggerWidth=$customScrollBox.data("minDraggerWidth");
                    var draggerContainerWidth=$dragger_container.width();
		
                    function AdjustDraggerWidth(){
                        if(draggerDimType=="auto"){
                            var adjDraggerWidth=Math.round(totalContent-((totalContent-visibleWidth)*1.3)); //adjust dragger width analogous to content
                            if(adjDraggerWidth<=minDraggerWidth){ //minimum dragger width
                                $dragger.css("width",minDraggerWidth+"px");
                            } else if(adjDraggerWidth>=draggerContainerWidth){
                                $dragger.css("width",draggerContainerWidth-10+"px");
                            } else {
                                $dragger.css("width",adjDraggerWidth+"px");
                            }
                        }
                    }
                    AdjustDraggerWidth();
		
                    var targX=0;
                    var draggerWidth=$dragger.width();
                    $dragger.draggable({ 
                        axis: "x", 
                        containment: "parent", 
                        drag: function(event, ui) {
                            ScrollX();
                        }, 
                        stop: function(event, ui) {
                            DraggerRelease();
                        }
                    });
			
                    $dragger_container.click(function(e) {
                        var $this=$(this);
                        var mouseCoord=(e.pageX - $this.offset().left);
                        if(mouseCoord<$dragger.position().left || mouseCoord>($dragger.position().left+$dragger.width())){
                            var targetPos=mouseCoord+$dragger.width();
                            if(targetPos<$dragger_container.width()){
                                $dragger.css("left",mouseCoord);
                                ScrollX();
                            } else {
                                $dragger.css("left",$dragger_container.width()-$dragger.width());
                                ScrollX();
                            }
                        }
                    });

                    //mousewheel
                    $(function($) {
                        if(mouseWheelSupport=="yes"){
                            $customScrollBox.unbind("mousewheel");
                            $customScrollBox.bind("mousewheel", function(event, delta) {
                                var vel = Math.abs(delta*10);
                                $dragger.css("left", $dragger.position().left-(delta*vel));
                                ScrollX();
                                if($dragger.position().left<0){
                                    $dragger.css("left", 0);
                                    $customScrollBox_container.stop();
                                    ScrollX();
                                }
                                if($dragger.position().left>$dragger_container.width()-$dragger.width()){
                                    $dragger.css("left", $dragger_container.width()-$dragger.width());
                                    $customScrollBox_container.stop();
                                    ScrollX();
                                }
                                return false;
                            });
                        }
                    });
				
                    //scroll buttons
                    if(scrollBtnsSupport=="yes"){
                        $scrollDownBtn.mouseup(function(){
                            BtnsScrollXStop();
                        }).mousedown(function(){
                            BtnsScrollX("down");
                        }).mouseout(function(){
                            BtnsScrollXStop();
                        });
				
                        $scrollUpBtn.mouseup(function(){
                            BtnsScrollXStop();
                        }).mousedown(function(){
                            BtnsScrollX("up");
                        }).mouseout(function(){
                            BtnsScrollXStop();
                        });
				
                        $scrollDownBtn.click(function(e) {
                            e.preventDefault();
                        });
                        $scrollUpBtn.click(function(e) {
                            e.preventDefault();
                        });
				
                        btnsScrollTimerX=0;
				
                        function BtnsScrollX(dir){
                            if(dir=="down"){
                                var btnsScrollTo=$dragger_container.width()-$dragger.width();
                                var scrollSpeed=Math.abs($dragger.position().left-btnsScrollTo)*(100/scrollBtnsSpeed);
                                $dragger.stop().animate({
                                    left: btnsScrollTo
                                }, scrollSpeed,"linear");
                            } else {
                                var btnsScrollTo=0;
                                var scrollSpeed=Math.abs($dragger.position().left-btnsScrollTo)*(100/scrollBtnsSpeed);
                                $dragger.stop().animate({
                                    left: -btnsScrollTo
                                    }, scrollSpeed,"linear");
                            }
                            clearInterval(btnsScrollTimerX);
                            btnsScrollTimerX = setInterval( ScrollX, 20);
                        }
				
                        function BtnsScrollXStop(){
                            clearInterval(btnsScrollTimerX);
                            $dragger.stop();
                        }
                    }

                    //scroll
                    var scrollAmount=(totalContent-visibleWidth)/(draggerContainerWidth-draggerWidth);
                    function ScrollX(){
                        var draggerX=$dragger.position().left;
                        var targX=-draggerX*scrollAmount;
                        var thePos=$customScrollBox_container.position().left-targX;
                        $customScrollBox_container.stop().animate({
                            left: "-="+thePos
                            }, animSpeed, easeType);
                    }
                } else { //disable scrollbar if content is short
                    $dragger.css("left",0).css("display","none"); //reset content scroll
                    $customScrollBox_container.css("left",0);
                    $dragger_container.css("display","none");
                    $scrollDownBtn.css("display","none");
                    $scrollUpBtn.css("display","none");
                }
            //vertical scrolling ------------------------------
            } else {
                var visibleHeight=$customScrollBox.height();                     
                if($customScrollBox_container.height()>visibleHeight){ //enable scrollbar if content is long
                    $dragger.css("display","block");
                    if(reloadType!="resize" && $customScrollBox_container.height()!=$customScrollBox.data("contentHeight")){
                        $dragger.css("top",0);
                        $customScrollBox_container.css("top",0);
                        $customScrollBox.data("contentHeight",$customScrollBox_container.height());
                    }
                    //$dragger_container.css("display","block");
                    $scrollDownBtn.css("display","inline-block");
                    $scrollUpBtn.css("display","inline-block");
                    var totalContent=$customScrollBox_content.height();
                    var minDraggerHeight=$customScrollBox.data("minDraggerHeight");
                    var draggerContainerHeight=$dragger_container.height();
		
                    function AdjustDraggerHeight(){
                        if(draggerDimType=="auto"){
                                          
                            var adjDraggerHeight=Math.round(totalContent-((totalContent-visibleHeight)*2.3)); //adjust dragger height analogous to content
                            // alert(totalContent);
                            if(adjDraggerHeight<=minDraggerHeight){ //minimum dragger height
                                $dragger.css("height",minDraggerHeight+"px").css("line-height",minDraggerHeight+"px");
                            } else if(adjDraggerHeight>=draggerContainerHeight){
                                $dragger.css("height",draggerContainerHeight-10+"px").css("line-height",draggerContainerHeight-10+"px");
                            } else {
                                $dragger.css("height",adjDraggerHeight+"px").css("line-height",adjDraggerHeight+"px");
                            }
                        }
                    }
                    AdjustDraggerHeight();
		
                    var targY=0;
                    var draggerHeight=$dragger.height();
                    $dragger.draggable({ 
                        axis: "y", 
                        containment: "parent", 
                        drag: function(event, ui) {
                            Scroll();
                        }, 
                        stop: function(event, ui) {
                            DraggerRelease();
                        }
                    });
				
                    $dragger_container.click(function(e) {
                        var $this=$(this);
                        var mouseCoord=(e.pageY - $this.offset().top);
                        if(mouseCoord<$dragger.position().top || mouseCoord>($dragger.position().top+$dragger.height())){
                            var targetPos=mouseCoord+$dragger.height();
                            if(targetPos<$dragger_container.height()){
                                $dragger.css("top",mouseCoord);
                                Scroll();
                            } else {
                                $dragger.css("top",$dragger_container.height()-$dragger.height());
                                Scroll();
                            }
                        }
                    });

                    //mousewheel
                    $(function($) {
                        if(mouseWheelSupport=="yes"){
                            $customScrollBox.unbind("mousewheel");
                            $customScrollBox.bind("mousewheel", function(event, delta) {
                                var vel = Math.abs(delta*10);
                                $dragger.css("top", $dragger.position().top-(delta*vel));
                                Scroll();
                                if($dragger.position().top<0){
                                    $dragger.css("top", 0);
                                    $customScrollBox_container.stop();
                                    Scroll();
                                }
                                if($dragger.position().top>$dragger_container.height()-$dragger.height()){
                                    $dragger.css("top", $dragger_container.height()-$dragger.height());
                                    $customScrollBox_container.stop();
                                    Scroll();
                                }
                                return false;
                            });
                        }
                    });

                    //scroll buttons
                    if(scrollBtnsSupport=="yes"){
                                    
                        $scrollDownBtn.mouseup(function(){
                            BtnsScrollStop();
                        }).mousedown(function(){
                            BtnsScroll("down");
                        }).mouseout(function(){
                            BtnsScrollStop();
                        });
				
                        $scrollUpBtn.mouseup(function(){
                            BtnsScrollStop();
                        }).mousedown(function(){
                            BtnsScroll("up");
                        }).mouseout(function(){
                            BtnsScrollStop();
                        });
				
                        $scrollDownBtn.click(function(e) {
                            e.preventDefault();
                        });
                        $scrollUpBtn.click(function(e) {
                            e.preventDefault();
                        });
				
                        btnsScrollTimer=0;
				
                        function BtnsScroll(dir){
                                           
                            if(dir=="down"){
                                                    
                                var btnsScrollTo=$dragger_container.height()-$dragger.height();
                                var scrollSpeed=Math.abs($dragger.position().top-btnsScrollTo)*(100/scrollBtnsSpeed);
                                $dragger.stop().animate({
                                    top: btnsScrollTo
                                }, scrollSpeed,"linear");
                            } else {
                                var btnsScrollTo=0;
                                var scrollSpeed=Math.abs($dragger.position().top-btnsScrollTo)*(100/scrollBtnsSpeed);
                                $dragger.stop().animate({
                                    top: -btnsScrollTo
                                    }, scrollSpeed,"linear");
                            }
                            clearInterval(btnsScrollTimer);
                            btnsScrollTimer = setInterval( Scroll, 20);
                        }
				
                        function BtnsScrollStop(){
                            clearInterval(btnsScrollTimer);
                            $dragger.stop();
                        }
                    }
				
                    //scroll
                    if(bottomSpace<1){
                        bottomSpace=1; //minimum bottomSpace value is 1
                    }
                    var scrollAmount=(totalContent-(visibleHeight/bottomSpace))/(draggerContainerHeight-draggerHeight);
                    function Scroll(){
                        var draggerY=$dragger.position().top;
                        var targY=-draggerY*scrollAmount;
                        var thePos=$customScrollBox_container.position().top-targY;
                        $customScrollBox_container.stop().animate({
                            top: "-="+thePos
                            }, animSpeed, easeType);
                        if (thePos ==scrollAmount){
                        }

                    }
                } else { //disable scrollbar if content is short
                    $dragger.css("top",0).css("display","none"); //reset content scroll
                    $customScrollBox_container.css("top",0);
                    $dragger_container.css("display","none");
                    $scrollDownBtn.css("display","none");
                    $scrollUpBtn.css("display","none");
                }
            }
		
            $dragger.mouseup(function(){
                DraggerRelease();
            }).mousedown(function(){
                DraggerPress();
            });

            function DraggerPress(){
                $dragger.addClass("dragger_pressed");
            }

            function DraggerRelease(){
                $dragger.removeClass("dragger_pressed");
            }
        }
	
        $(window).resize(function() {
            if(scrollType=="horizontal"){
                if($dragger.position().left>$dragger_container.width()-$dragger.width()){
                    $dragger.css("left", $dragger_container.width()-$dragger.width());
                }
            } else {
                if($dragger.position().top>$dragger_container.height()-$dragger.height()){
                    $dragger.css("top", $dragger_container.height()-$dragger.height());
                }
            }
            CustomScroller("resize");
        });
    };  
})(jQuery);